# 导入所需的模块
from enum import IntEnum
from typing import Type
from alphagen_qlib.stock_data import FeatureType
from alphagen.data.expression import Operator, Expression


# 序列指示器类型枚举
class SequenceIndicatorType(IntEnum):
    BEG = 0  # 序列开始标记
    SEP = 1  # 序列分隔符标记


# Token基类：所有标记的基础类
class Token:
    def __repr__(self):
        return str(self)


# 常量标记类：用于表示数值常量
class ConstantToken(Token):
    def __init__(self, constant: float) -> None:
        self.constant = constant  # 存储常量值

    def __str__(self): return str(self.constant)


# 时间间隔标记类：用于表示时间差值
class DeltaTimeToken(Token):
    def __init__(self, delta_time: int) -> None:
        self.delta_time = delta_time  # 存储时间间隔值

    def __str__(self): return str(self.delta_time)


# 特征标记类：用于表示股票特征
class FeatureToken(Token):
    def __init__(self, feature: FeatureType) -> None:
        self.feature = feature  # 存储特征类型

    def __str__(self): return '$' + self.feature.name.lower()


# 运算符标记类：用于表示操作符
class OperatorToken(Token):
    def __init__(self, operator: Type[Operator]) -> None:
        self.operator = operator  # 存储运算符类型

    def __str__(self): return self.operator.__name__


# 序列指示器标记类：用于表示序列的特殊标记（开始或分隔）
class SequenceIndicatorToken(Token):
    def __init__(self, indicator: SequenceIndicatorType) -> None:
        self.indicator = indicator  # 存储指示器类型

    def __str__(self): return self.indicator.name


# 表达式标记类：用于表示完整的表达式
class ExpressionToken(Token):
    def __init__(self, expr: Expression) -> None:
        self.expression = expr  # 存储表达式对象

    def __str__(self): return str(self.expression)


# 创建常用的全局标记实例
BEG_TOKEN = SequenceIndicatorToken(SequenceIndicatorType.BEG)  # 序列开始标记
SEP_TOKEN = SequenceIndicatorToken(SequenceIndicatorType.SEP)  # 序列分隔标记
